
class AsignacionContinua():
    
    def __init__(self,ajuste):
        self.ajuste = ajuste #algoritmo de ajuste
        self.tabla = {} # utiliza un diccionario como tabla
        self.tablaDirecciones = {} #para guardar direcciones como key e pid como valor
        
    def getTabla(self):
        return self.tabla
    
    def getTablaDirecciones(self):
        return self.tablaDirecciones

    def agregarDireccionBase(self,pid,direccionBase):
        self.tabla[pid] = direccionBase #la clave es una ID programa,y el value es la direccion base.
        self.tablaDirecciones[direccionBase] = pid
        
    def eliminarDireccionBase(self,pid):
        dirB =self.obtenerDirBase(pid)
        del self.tabla[pid]
        del self.tablaDirecciones[dirB]
        
    #cuando es asignacion continua el disco guarda pid -listaInstrucciones
    def crearDatosParaDisco(self,pid,listaInstrucciones): 
        return listaInstrucciones
    
    def obtenerDirBase(self,pid):
        return self.tabla[pid]
          
    def eliminarProgramaDeMemoria(self,pid):
        self.ajuste.eliminarPrograma(self.obtenerDirBase(pid))
        self.eliminarDireccionBase(pid)
    
    def guardaEnDisco(self,kernel):
        pid = kernel.getProgramaMenosUso()
        disco = kernel.getDisco()
        self.ajuste.ponerEnDisco(self.obtenerDirBase(pid),disco,pid,self)
        
    def obtenerInstruccion(self,pcb,manager):
        pid = pcb.getIdProgr()
        desplazamiento = pcb.getCurrentInst()
        
        if pcb.getEstaEnDisco() :
                disco=manager.getKernel().getDisco()
                #self.guardaEnMemoria(pid,pcb.getPrograma().getListaInstrucciones(),manager)
                self.guardaEnMemoria(pid,disco.obtenerPrograma(pid),manager)
                pcb.setEstaEnDisco(False)
                #los datos en el disco rigido no se borran xD
        
        #el tipo de ajuste conoce la memoria,x esa razon se le dice read al algoritmo de ajuste que corresponda.
        return self.ajuste.leerCelda( (self.obtenerDirBase(pid)+ desplazamiento) )
    
    def guardaEnMemoria(self,pid,listaInstrucciones,managerInterrupt):
        self.ajuste.guardarPrograma(pid,listaInstrucciones,self,managerInterrupt)
        #se pasa por parametro asi ademas de agregar el programa a la memoria tmbien le setea la direccion base.

        